SpringGraph++

Mr. Muskrat on 2004-07-10T17:21:33

TeeJay released a new version of SpringGraph about four days ago. I saw the example scripts and the output from them and I thought "that's pretty cool."

I had the idea to show file links graphically so I installed GD and SpringGraph at work on my Windows XP box running AS Perl 5.8.3. I proceeded to try out the example scripts and well, one out of three scripts worked (OO worked but procedural and records did not). I fired off an email to him about it.

When I got home, I installed GD and SpringGraph on my Windows XP box running AS Perl 5.8.4. I once again tried out the example scripts and this time two of the three worked (oo and procedural worked but records did not). Once again I sent TeeJay an email about it.

I started to look into why it was failing and spent about a half an hour before I decided that it really wasn't worth it. I didn't need records for my project.

I started coding and in under 30 minutes I had a suitable proof of concept script. I didn't have to think about how to graph it. With SpringGraph, you just add nodes and then later add edges. Very nice. You have done a really good job TeeJay and I am looking forward to future versions.

Here's the script if you are curious:

#!/usr/bin/perl
use strict;
use warnings;
use Cwd;
use File::Find;
use SpringGraph;

my $graph = new SpringGraph;
my $filename = 'oo_file_find.png';

find(\&process_files, cwd); # do your magic

print "outputting as png.\n";

$graph->as_png($filename);

print "finished.\n";

sub process_files {
  my $file = $_;

  return unless -f $file;
  return unless $file =~ /\.(?:p[l|m]|cgi)$/i;

  $graph->add_node($file, label => $file);

  open(FILE, '<', $file) or print "couldn't open $file\n" && return;

  while () {
    next if /^#/;
    if (/\buse\s/) {
      # I didn't use a next because I may want to find other files
      # in form action links, for example.  Capture the module
      # information and strip everything after the first whitespace
      my ($match) = /\buse\s+(.*);/; 
      $match = (split /\s/, $match)[0];

      $graph->add_edge($file => $match);
    }
  }

  close FILE;
}


Here's a link to one of the better results files that was produced as a PNG. oo_file_find.png


you might like the pre_release at the website

TeeJay on 2004-07-12T09:34:05

Thanks for the feedback, its always nice to get the first mail about something you have been working on and released.

Yes, it still requires some work : 0.02 means not done yet, although I have other modules on CPAN that are only 0.01 or 0.02 that are fairly solid ( or at least don't break or fail often).

Anyway I have a pre-release of version 0.03 at the digraph bit of my site if you want it.

I plan to spend a few days working out some stuff using paper and pencil (and rubber) before attacking all the geometry again.